Repository navigation
fix(schema): keep sla-window at its 3.2 shape; business time moves to the creative review SLA (#8501 entries 11, 12) - #8762
Conversation
e215b06 to
868cfea
Compare
…erimental, and inventory the rest Adds scripts/audit-schema-bounds.cjs and its inventory: every unbounded array and string in the schema source, by stability, request or response side and proposed limit, plus every property or collection list carried inline. Bounds the arrays and strings that are new in 3.3 or experimental: 646 maxItems/maxLength keywords in 152 schemas, written by `node scripts/audit-schema-bounds.cjs --apply`, which is idempotent and is the one command for regenerating the slice after a conflict. Stable fields are proposed for 4.0 in specs/collection-bounds-proposal.md and registered as schema_bounds_required_in_4_0. Not bounded: get_adcp_capabilities and its referenced types (#8198), inline property and collection lists, five nodes the SDK generators cannot carry a bound on, and seven 3.3 beta fields that the #8501 withdrawal PRs (#8765, #8762, #8758, #8767) remove. The script now compares with the highest 3.2.x release (3.2.8), the base lint-additive-minor uses. Build Check runs its --check-unreleased guard as npm run lint:schema-bounds, so every new 3.3 or experimental array or string arrives with a bound. The MCP parity compile limit moves from 1,376,000 to 1,378,000 bytes (the controller closure measures 1,377,055). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…erimental, and inventory the rest Adds scripts/audit-schema-bounds.cjs and its inventory: every unbounded array and string in the schema source, by stability, request or response side and proposed limit, plus every property or collection list carried inline. Bounds the arrays and strings that are new in 3.3 or experimental: 646 maxItems/maxLength keywords in 152 schemas, written by `node scripts/audit-schema-bounds.cjs --apply`, which is idempotent and is the one command for regenerating the slice after a conflict. Stable fields are proposed for 4.0 in specs/collection-bounds-proposal.md and registered as schema_bounds_required_in_4_0. Not bounded: get_adcp_capabilities and its referenced types (#8198), inline property and collection lists, five nodes the SDK generators cannot carry a bound on, and seven 3.3 beta fields that the #8501 withdrawal PRs (#8765, #8762, #8758, #8767) remove. The script now compares with the highest 3.2.x release (3.2.8), the base lint-additive-minor uses. Build Check runs its --check-unreleased guard as npm run lint:schema-bounds, so every new 3.3 or experimental array or string arrives with a bound. The MCP parity compile limit moves from 1,376,000 to 1,378,000 bytes (the controller closure measures 1,377,055). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…erimental, and inventory the rest Adds scripts/audit-schema-bounds.cjs and its inventory: every unbounded array and string in the schema source, by stability, request or response side and proposed limit, plus every property or collection list carried inline. Bounds the arrays and strings that are new in 3.3 or experimental: 648 maxItems/maxLength keywords in 152 schemas, written by `node scripts/audit-schema-bounds.cjs --apply`, which is idempotent and is the one command for regenerating the slice after a conflict. Stable fields are proposed for 4.0 in specs/collection-bounds-proposal.md and registered as schema_bounds_required_in_4_0. Not bounded: get_adcp_capabilities and its referenced types (#8198), inline property and collection lists, five nodes the SDK generators cannot carry a bound on, and seven 3.3 beta fields that the #8501 withdrawal PRs (#8765, #8762, #8758, #8767) remove. The script now compares with the highest 3.2.x release (3.2.8), the base lint-additive-minor uses. Build Check runs its --check-unreleased guard as npm run lint:schema-bounds, so every new 3.3 or experimental array or string arrives with a bound. The match_keys arrays #8446 added on product identity and TMP provider registration get maxItems 64, the cap media_buy.supported_match_keys already carries. The MCP parity compile limit moves from 1,384,000 to 1,386,000 bytes (the controller closure measures 1,385,040). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…erimental, and inventory the rest Adds scripts/audit-schema-bounds.cjs and its inventory: every unbounded array and string in the schema source, by stability, request or response side and proposed limit, plus every property or collection list carried inline. Bounds the arrays and strings that are new in 3.3 or experimental: 648 maxItems/maxLength keywords in 152 schemas, written by `node scripts/audit-schema-bounds.cjs --apply`, which is idempotent and is the one command for regenerating the slice after a conflict. Stable fields are proposed for 4.0 in specs/collection-bounds-proposal.md and registered as schema_bounds_required_in_4_0. Not bounded: get_adcp_capabilities and its referenced types (#8198), inline property and collection lists, five nodes the SDK generators cannot carry a bound on, and seven 3.3 beta fields that the #8501 withdrawal PRs (#8765, #8762, #8758, #8767) remove. The script now compares with the highest 3.2.x release (3.2.8), the base lint-additive-minor uses. Build Check runs its --check-unreleased guard as npm run lint:schema-bounds, so every new 3.3 or experimental array or string arrives with a bound. The match_keys arrays #8446 added on product identity and TMP provider registration get maxItems 64, the cap media_buy.supported_match_keys already carries. The MCP parity compile limit moves from 1,384,000 to 1,386,000 bytes (the controller closure measures 1,385,040). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…erimental, and inventory the rest Adds scripts/audit-schema-bounds.cjs and its inventory: every unbounded array and string in the schema source, by stability, request or response side and proposed limit, plus every property or collection list carried inline. Bounds the arrays and strings that are new in 3.3 or experimental: 648 maxItems/maxLength keywords in 152 schemas, written by `node scripts/audit-schema-bounds.cjs --apply`, which is idempotent and is the one command for regenerating the slice after a conflict. Stable fields are proposed for 4.0 in specs/collection-bounds-proposal.md and registered as schema_bounds_required_in_4_0. Not bounded: get_adcp_capabilities and its referenced types (#8198), inline property and collection lists, five nodes the SDK generators cannot carry a bound on, and seven 3.3 beta fields that the #8501 withdrawal PRs (#8765, #8762, #8758, #8767) remove. The script now compares with the highest 3.2.x release (3.2.8), the base lint-additive-minor uses. Build Check runs its --check-unreleased guard as npm run lint:schema-bounds, so every new 3.3 or experimental array or string arrives with a bound. The match_keys arrays #8446 added on product identity and TMP provider registration get maxItems 64, the cap media_buy.supported_match_keys already carries. The MCP parity compile limit moves from 1,384,000 to 1,386,000 bytes (the controller closure measures 1,385,040). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… creative review SLA #8501 entries 11 and 12. core/sla-window.json is held closed with the commercial terms until 4.0 (DR-0036), and 3.3.0-beta.1 added clock and business_calendar_id to it, so a strict 3.2 validator rejected a 3.3 SLA. sla-window goes back to its 3.2.8 publication (only $id differs). The signed terms reach it through change_terms[].processing_sla, and 3.2.8 says sellers include weekends and non-working periods in the maximum. clock and business_calendar_id move to core/creative-review-sla.json, which no longer composes sla-window: it defines its own durations, keeps completion_max required and the business-clock calendar rule, and is open. escalation-sla loses clock. An action's sla, a change term's processing_sla and the escalation SLA are elapsed time only. Tests pin sla-window to 3.2.8 and check the business clock is rejected on the four action schemas, the change term and the escalation SLA. The two sla-window baseline rows go, leaving 2. The MCP parity bound moves to 1_388_000 (measured 1_387_457 on main after #8866). Docs, the migration guide and a minor changeset name where the fields live now. Refs #8501 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
868cfea to
cb0ea9d
Compare
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — gated schema paths require human/CODEOWNERS approval.
The reviewer found a clean diff: the business clock fields (clock, business_calendar_id) are relocated off the now-closed core/sla-window.json onto core/creative-review-sla.json, restoring sla-window to its exact 3.2.8 byte-for-byte shape. creative-review-sla gets self-contained properties, kept-required completion_max, open additionalProperties (correct for a new 3.3 schema per DR-0009), and a correct if/then/else calendar constraint. Consumers are coherent, docs/migration/release-notes/lint-baseline are consistent, and the minor changeset is correct (additive vs stable 3.2.x). No Critical/High/Medium findings.
However, this PR modifies files under static/schemas/source/**, which are under a hard, deterministic approval gate (gated_paths: true), and review_decision is REVIEW_REQUIRED — not APPROVED. Per decision rule row 2, the gate is not satisfied and the outcome must be escalate. A clean diff does not lift this gate; only a real human/CODEOWNERS approval does.
Escalation reasons
- Modifies gated protocol-source schemas (
static/schemas/source/core/creative-review-sla.json,core/escalation-sla.json,core/sla-window.json,core/x-entity-types.json,index.json,media-buy/change-term.json,protocol/get-adcp-capabilities-response.json) whilereview_decisionisREVIEW_REQUIRED. Human/CODEOWNERS approval required before merge.
Why human review
- Modifies gated paths under static/schemas/source/** while review_decision is REVIEW_REQUIRED (not APPROVED) — human/CODEOWNERS approval required per hard approval gate.
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/core/creative-review-sla.json (modified) matches
static/schemas/source/**; static/schemas/source/core/escalation-sla.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/sla-window.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/x-entity-types.json (modified) matchesstatic/schemas/source/**; static/schemas/source/index.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/change-term.json (modified) matchesstatic/schemas/source/**; static/schemas/source/protocol/get-adcp-capabilities-response.json (modified) matchesstatic/schemas/source/**) and the current GitHub review decision is 'REVIEW_REQUIRED', not APPROVED. This is a hard gate enforced in code — Ladon cannot auto-approve until a human/CODEOWNERS approval is recorded, regardless of how clean the diff is.
…se docs #8762 (sla-window back to its 3.2 shape, business time on the creative review SLA) and #8957 (available_installment_statuses on the canonical reporting capabilities) merged; #8762's own release-doc lines arrive with the rebase. Drop both from the dependency markers, name the canonical product's reporting_capabilities in the release-notes media_buy.installment_lifecycle row, and refresh the #8501 row of the in-review table. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…se docs #8762 (sla-window back to its 3.2 shape, business time on the creative review SLA) and #8957 (available_installment_statuses on the canonical reporting capabilities) merged; #8762's own release-doc lines arrive with the rebase. Drop both from the dependency markers, name the canonical product's reporting_capabilities in the release-notes media_buy.installment_lifecycle row, and refresh the #8501 row of the in-review table. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…se docs #8762 (sla-window back to its 3.2 shape, business time on the creative review SLA) and #8957 (available_installment_statuses on the canonical reporting capabilities) merged; #8762's own release-doc lines arrive with the rebase. Drop both from the dependency markers, name the canonical product's reporting_capabilities in the release-notes media_buy.installment_lifecycle row, and refresh the #8501 row of the in-review table. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…se docs #8762 (sla-window back to its 3.2 shape, business time on the creative review SLA) and #8957 (available_installment_statuses on the canonical reporting capabilities) merged; #8762's own release-doc lines arrive with the rebase. Drop both from the dependency markers, name the canonical product's reporting_capabilities in the release-notes media_buy.installment_lifecycle row, and refresh the #8501 row of the in-review table. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…se docs #8762 (sla-window back to its 3.2 shape, business time on the creative review SLA) and #8957 (available_installment_statuses on the canonical reporting capabilities) merged; #8762's own release-doc lines arrive with the rebase. Drop both from the dependency markers, name the canonical product's reporting_capabilities in the release-notes media_buy.installment_lifecycle row, and refresh the #8501 row of the in-review table. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…se docs #8762 (sla-window back to its 3.2 shape, business time on the creative review SLA) and #8957 (available_installment_statuses on the canonical reporting capabilities) merged; #8762's own release-doc lines arrive with the rebase. Drop both from the dependency markers, name the canonical product's reporting_capabilities in the release-notes media_buy.installment_lifecycle row, and refresh the #8501 row of the in-review table. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…se docs #8762 (sla-window back to its 3.2 shape, business time on the creative review SLA) and #8957 (available_installment_statuses on the canonical reporting capabilities) merged; #8762's own release-doc lines arrive with the rebase. Drop both from the dependency markers, name the canonical product's reporting_capabilities in the release-notes media_buy.installment_lifecycle row, and refresh the #8501 row of the in-review table. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…se docs #8762 (sla-window back to its 3.2 shape, business time on the creative review SLA) and #8957 (available_installment_statuses on the canonical reporting capabilities) merged; #8762's own release-doc lines arrive with the rebase. Drop both from the dependency markers, name the canonical product's reporting_capabilities in the release-notes media_buy.installment_lifecycle row, and refresh the #8501 row of the in-review table. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…se docs #8762 (sla-window back to its 3.2 shape, business time on the creative review SLA) and #8957 (available_installment_statuses on the canonical reporting capabilities) merged; #8762's own release-doc lines arrive with the rebase. Drop both from the dependency markers, name the canonical product's reporting_capabilities in the release-notes media_buy.installment_lifecycle row, and refresh the #8501 row of the in-review table. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…se docs #8762 (sla-window back to its 3.2 shape, business time on the creative review SLA) and #8957 (available_installment_statuses on the canonical reporting capabilities) merged; #8762's own release-doc lines arrive with the rebase. Drop both from the dependency markers, name the canonical product's reporting_capabilities in the release-notes media_buy.installment_lifecycle row, and refresh the #8501 row of the in-review table. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Refs #8501 (entries 11 and 12).
This merges only after the consent window closes on Fri 2026-11-13, before the 3.3 RC.
static/schemas/source/**is Ladon-gated, so a human merges it.Summary
3.3.0-beta.1 added
clockandbusiness_calendar_idtocore/sla-window.json. 3.2 published that schema closed, and #8866 keeps it closed with the commercial terms until 4.0 (DR-0036), so a strict 3.2 validator rejects a 3.3 SLA. This PR putssla-windowback to its 3.2.8 shape and moves business time to the creative review SLA.Rebased onto
mainafter #8866. Per the #8501 re-triage, only entries 11 and 12 remain. The commit for entries 4 and 5 is dropped: #8866 openedcore/media-buy-available-action.jsonandcore/canonical-media-buy-action-fields.json, soreview_slaon a buy action is an addition to an open schema and stays.clockandbusiness_calendar_idmove to the creative review SLAThe signed terms reach
sla-windowthroughchange_terms[].processing_sla, and 3.2.8 says sellers include weekends and non-working periods in the maximum.core/sla-window.jsonmatches its 3.2.8 publication. Only$iddiffers.core/creative-review-sla.jsonno longer composessla-window. It definesclock(defaultelapsed),business_calendar_id,response_maxandcompletion_maxitself. It keepscompletion_maxrequired, the business-clockif/then/elseand the calendar and snapshot verifier constraints. It is open.core/escalation-sla.jsonlosesclock. Itsresponse_maxgets a description, because the 3.2.8sla-windowtext measures from buyer issuance, not seller receipt.media-buy/change-term.json: theprocessing_sladescription is back to its 3.2.8 text.x-entity-types,index.jsonand theget_adcp_capabilitiesbusiness_calendarsfield.Shared
sla-windowrows leavescripts/lint-additive-minor-baseline.json, which keeps 2 entries:metric_id(Minor releases sometimes break older buyers, and our versioning rules disagree about whether that's allowed #8501 entry 6) andevaluator(entry 26).creative-review-business-clock.md(minor).Wire effect.
clockandbusiness_calendar_idare accepted only on the creative review SLA:creative_policy.review_sla, and thereview_slaon a creative action.sla, a change term'sprocessing_slaand the escalation SLA reject them, evenclock: "elapsed", because 3.2.8 does.For reviewers
tests/mcp-schema-projection.test.cjsmovesPARITY_COMPILE_LIMITfrom 1,387,000 to 1,388,000 bytes. Onmainthe comply-test-controller closure measures 1,386,397 bytes. This PR measures 1,387,457, because the review SLA now inlines its own durations andsla-windowhas its longer 3.2.8 descriptions back.Testing
On the rebased tree (
main2dc672e316+cb0ea9d135):npm run build:schemas: pass.npm run test:schemas: 1192/1192, plus premium-display 10/10 and geo-region 6/6.tests/service-commitments.test.cjscovers:sla-windowequals 3.2.8 apart from$id, and rejectsclockandbusiness_calendar_id;creative-review-slais open,clockdefaults toelapsed, and business time works;clock;processing_slais rejected;slais rejected on all four action schemas.npm run test:mcp-schema-projection: 42/42.npm run test:examples: pass.npm run lint:additive-minorandnpm run test:additive-minor: pass, 2 recorded, 0 new.Local hook
The rebased commit was made with
HUSKY=0, with the release coordinator's approval. The hook's server-unit stage (precommit:server-unit) hit its own 1500s timeout at load ~70, with no assertion failure, and was skipped for load. This PR touches no server file. CI is the gate.I ran every other hook step by hand on the commit, and they pass:
npm run test:unit, the dynamic-import, format-identity and callApi guards,npm run typecheck, and the image check.🤖 Generated with Claude Code